//
// Created by Administrator on 2020/7/26.
//T6章:继承与派生(小结)
//本章主要内容
//  A-继承与派生的基本概念
//  B-单继承与多继承
//  C-类成员的访问控制
//  D-派生类对象的构造和析构
//  E-派生类与基类对象的类型转换
//  F-类成员的标识与访问
//  G-虚继承

//eg1:声明一个基类Animal,有私有整型成员变量age,构造其派生类dog,在其成员函数
//    SetAge(int n)中直接给age赋值,看看会有什么问题？把age改为公有成员变量,
//    还会有问题吗？
/*
#include <iostream>
using namespace std;
//--------Animal类------//
class Animal
{
public:
    int age;
};
//--------Dog派生类------//
class Dog: public Animal
{
public:
    void SetAge(int n){age=n;}
};
//--------main主函数------//
int main()
{
    Dog d;
    d.SetAge(2);
    return 0;
}
*/
//eg2:声明一个基类BaseClass,有整型成员变量Number,
//    构造其派生类DerivedClass,观察构造函数和析构函数的执行情况
/*
#include <iostream>
using namespace std;

class BaseClass
{
public:
    int Number;
    int getNumber(){return Number;}
    BaseClass(){cout<<"BaseClass construct"<<endl;}
    ~BaseClass(){cout<<"BaseClass destruct"<<endl;}
};

class DerivedClass:BaseClass
{
public:
    DerivedClass()//构造函数
    {
        Number=0;
        Number++;
        cout<<"DerivedClass Construction.Number="<<getNumber()<<endl;
    }
    ~DerivedClass()//析构函数
     {
        Number--;
        cout<<"DerivedClass Destruction.Number="<<getNumber()<<endl;
     }
};

int main()
{
    DerivedClass d;
    return  0;
}
*/

//eg3:声明车(vehicle)基类,具有MaxSpeed、Weight等成员变量,Run、Stop等成员函数
//    由此派生出自行车(bicycle)类、汽车(motorcar)类。
//    其中:自行车(bicycle)类有高度(Height)等属性,汽车(motorcar)类有座位(SeatNum)等属性
//    从bicycle和motorcar派生出摩托车(motorcycle)类,在继承过程中,注意把vehicle设置为虚基类。
//    如果不把vehicle设置为虚基类,会有什么问题？

#include <iostream>
using namespace std;

class Vehicle
{
public:
    int MaxSpeed;
    int Weight;
    void Run(){cout<<"Vehicle run"<<endl;};
    void Stop(){cout<<"Vehicle stop"<<endl;};
};

class Bicycle:virtual public Vehicle//把vehicle作为虚基类   把vehicle设置为非虚基类,会编译错误(会出现二义性问题)
{
public:
    int Height;
};

class Motorcar:virtual public Vehicle//把vehicle作为虚基类  把vehicle设置为非虚基类,会编译错误(会出现二义性问题)
{
public:
    int SeatNum;
};
//从bicycle和motorcar派生出摩托车(motorcycle)类
class Motorcycle: public Bicycle, public Motorcar
{

};

int main()
{
    Motorcycle m;

    m.Height=1;
    m.SeatNum=2;
    m.Weight=100;
    m.MaxSpeed=60;

    m.Run();
    m.Stop();

    return 0;
}
